package com.ncl.service.impl;


import com.ncl.constant.MyConstants;
import com.ncl.domin.TTranDataMonthList;
import com.ncl.mapper.TTranDataMonthListMapper;
import com.ncl.service.ITTranDataMonthListService;
import com.ncl.tranRequest.RequestData;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * 【请填写功能名称】Service业务层处理
 *
 * @author Chang
 * @date 2024-05-16
 */
@Service
@Slf4j
public class TTranDataMonthListServiceImpl implements ITTranDataMonthListService {
    @Autowired
    private TTranDataMonthListMapper tTranDataMonthListMapper;

    /**
     * 根据日期  年月    查询复合条件的数据
     *
     * @param requestData 【请填写功能名称】主键
     * @return
     */
    @Override
    public String selectTTranDataMonthListByListno(RequestData requestData) {
        try {
            // 查询数据
            List<TTranDataMonthList> tTranDataMonthLists = tTranDataMonthListMapper.selectTTranDataMonthListByListno(requestData.getDate());
            TTranDataMonthList tTranDataMonthList = tTranDataMonthLists.get(0);
            // 创建一个新的Excel工作簿
            Workbook workbook = new XSSFWorkbook();
            // 创建一个工作表
            Sheet sheet = workbook.createSheet(requestData.getWorkSheetName());
            // 设置格式
            creatExcelHeader(workbook, sheet, requestData,tTranDataMonthList);

            // 将查询数据写入excel
            writeData(tTranDataMonthLists, sheet);
            // 设置文件保存的完整路径（包括文件名）
            // 假设我们有一个服务器的目录，如 "/home/app/exports/"
            String serverPath = "C:/Users/ASUS/Desktop/";
            String fileName = requestData.getFileName() + MyConstants.FILE_NAME_SUFFIX;
            String fullPathFileName = serverPath + fileName;

            // 确保目录存在
            File dir = new File(serverPath);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            // 写入文件
//            String fileName = requestData.getFileName() + MyConstants.FILE_NAME_SUFFIX;
            try (FileOutputStream fileOut = new FileOutputStream(fullPathFileName)) {
                workbook.write(fileOut);
            }

            // 关闭工作簿
            workbook.close();

            // 返回文件路径或成功消息
            return "文件导出成功!";
        } catch (IOException e) {
            // 使用日志记录库记录异常
            log.error("Error writing to Excel file", e);
            // 可以考虑抛出一个自定义异常或返回一个错误消息
            throw new RuntimeException("Failed to write to Excel file", e);
        }
    }

    /**
     * 辅助方法：创建表头样式
     *
     * @param workbook
     * @return
     */
    private CellStyle createHeaderStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        Font font = workbook.createFont();
        font.setBold(true); // 设置字体为加粗
        style.setFont(font);
        style.setAlignment(HorizontalAlignment.CENTER); // 设置文本居中对齐
        return style;
    }

    /**
     * 数据写入excel
     *
     * @param tTranDataMonthLists
     * @param sheet
     */
    private void writeData(List<TTranDataMonthList> tTranDataMonthLists, Sheet sheet) {
        int dataRowNum = 6;
        for (TTranDataMonthList item : tTranDataMonthLists) {
            Row dataRow = sheet.createRow(dataRowNum++); // 创建新行，并递增行号
            // 假设 TTranDataMonth 类有对应的方法来获取各个字段的值
            Cell cell0 = dataRow.createCell(0);
            cell0.setCellValue(String.valueOf(dataRowNum - 6)); // 序号（可以从1开始编号，也可以从0开始，视具体需求而定）
            dataRow.createCell(1).setCellValue(StringUtils.trim(item.getPolicyorgancode())); // 管理机构
            dataRow.createCell(2).setCellValue(StringUtils.trim(item.getSapcomcodesysname())); // 机构名称
            dataRow.createCell(3).setCellValue(StringUtils.trim(item.getSapcomcode())); // SAP机构
            dataRow.createCell(4).setCellValue(StringUtils.trim(item.getBusiProdCode())); // 险种
            dataRow.createCell(5).setCellValue(StringUtils.trim(item.getBusiProdName())); // 险种名称
            dataRow.createCell(6).setCellValue(StringUtils.trim(item.getFeeAmount().setScale(2, RoundingMode.HALF_UP).toString())); // 金额（假设是数值类型，需要转换为字符串）
            dataRow.createCell(7).setCellValue(StringUtils.trim(String.valueOf(item.getUnit()))); // 件数（同样假设是数值类型）
            dataRow.createCell(8).setCellValue(StringUtils.trim(item.getCzflag())); // 重组标志

        }
    }

    /**
     * 设置表头
     *
     * @param workbook
     * @param sheet
     */
    private void creatExcelHeader(Workbook workbook, Sheet sheet, RequestData requestData, TTranDataMonthList tTranDataMonthList) {
        Date makedate = tTranDataMonthList.getMakedate();
        SimpleDateFormat simpleDateFormat0 = new SimpleDateFormat("HH:mm:ss");
        SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("MM/dd/yy");
        String format = simpleDateFormat0.format(makedate);
        String format1 = simpleDateFormat1.format(makedate);
        // 创建一个表头行
        Row row0 = sheet.createRow(0);
        row0.createCell(0).setCellValue(MyConstants.MONTH_LIST);

        Row row1 = sheet.createRow(1);
        row1.createCell(0).setCellValue(MyConstants.COUNT_MONTH);
        row1.createCell(1).setCellValue(requestData.getDate());

        Row row2 = sheet.createRow(2);
        row2.createCell(0).setCellValue(MyConstants.MAKE_DATE);
        row2.createCell(1).setCellValue(format1);

        Row row3 = sheet.createRow(3);
        row3.createCell(0).setCellValue(MyConstants.MAKE_TIME);
        row3.createCell(1).setCellValue(format);

        Row headerRow = sheet.createRow(5);

        String[] headers = {
                "序号", "管理机构", "机构名称", "SAP机构", "险种", "险种名称", "金额", "件数", "重组标志"
        };
        // 辅助方法：创建表头样式
        CellStyle headerStyle = createHeaderStyle(workbook);
        for (int i = 0; i < headers.length; i++) {
            Cell cell = headerRow.createCell(i);
            cell.setCellValue(headers[i]);
            cell.setCellStyle(headerStyle); // 应用样式
        }
    }
//    /**
//     * 查询【请填写功能名称】列表
//     *
//     * @param tTranDataMonthList 【请填写功能名称】
//     * @return 【请填写功能名称】
//     */
//    @Override
//    public List<TTranDataMonthList> selectTTranDataMonthListList(TTranDataMonthList tTranDataMonthList)
//    {
//        return tTranDataMonthListMapper.selectTTranDataMonthListList(tTranDataMonthList);
//    }
//
//    /**
//     * 新增【请填写功能名称】
//     *
//     * @param tTranDataMonthList 【请填写功能名称】
//     * @return 结果
//     */
//    @Override
//    public int insertTTranDataMonthList(TTranDataMonthList tTranDataMonthList)
//    {
//        return tTranDataMonthListMapper.insertTTranDataMonthList(tTranDataMonthList);
//    }
//
//    /**
//     * 修改【请填写功能名称】
//     *
//     * @param tTranDataMonthList 【请填写功能名称】
//     * @return 结果
//     */
//    @Override
//    public int updateTTranDataMonthList(TTranDataMonthList tTranDataMonthList)
//    {
//        return tTranDataMonthListMapper.updateTTranDataMonthList(tTranDataMonthList);
//    }
//
//    /**
//     * 批量删除【请填写功能名称】
//     *
//     * @param listnos 需要删除的【请填写功能名称】主键
//     * @return 结果
//     */
//    @Override
//    public int deleteTTranDataMonthListByListnos(String[] listnos)
//    {
//        return tTranDataMonthListMapper.deleteTTranDataMonthListByListnos(listnos);
//    }
//
//    /**
//     * 删除【请填写功能名称】信息
//     *
//     * @param listno 【请填写功能名称】主键
//     * @return 结果
//     */
//    @Override
//    public int deleteTTranDataMonthListByListno(String listno)
//    {
//        return tTranDataMonthListMapper.deleteTTranDataMonthListByListno(listno);
//    }
}
